/*
 * 文件名：WsStaffOfficeImpl.java
 * 版权：Copyright by http://www.infopub.top/
 * 描述：
 * 修改人：Awoke
 * 修改时间：2020年1月1日
 * 跟踪单号：
 * 修改单号：
 * 修改内容：
 */

package top.infopub.mgr.hr.service.impl;


import com.google.common.base.Joiner;
import com.google.common.collect.Sets;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import top.infopub.exception.ServiceException;
import top.infopub.mgr.hr.domain.StaffOfficeDomain;
import top.infopub.mgr.hr.service.OrgInfoService;
import top.infopub.mgr.hr.service.StaffOfficeService;
import top.infopub.mgr.hr.service.WsStaffOfficeService;
import top.infopub.model.hr.OrgInfo;
import top.infopub.security.service.SysStaffOfficeService;
import top.infopub.security.util.SessionUserUtils;
import top.infopub.security.vo.AuthorizationVO;

import java.util.List;
import java.util.Set;


/**
 * 登录用户当前有效绑定就职信息 相关服务方法 实现
 * @author Awoke
 * @version 2020年1月1日
 * @see WsStaffOfficeServiceImpl
 * @since
 */
@Service
public class WsStaffOfficeServiceImpl implements WsStaffOfficeService, SysStaffOfficeService {

    @Autowired
    private OrgInfoService orgInfoService;

    @Autowired
    private StaffOfficeService staffOfficeService;

    @Override
    public OrgInfo superOrg() {
        OrgInfo query = new OrgInfo();
        query.setParentId("-1");
        query.setTypes("1");
        // query.setState(1);
        List<OrgInfo> list = orgInfoService.selectByEntityWhere(query);
        if (list == null || list.isEmpty()) {
            throw new ServiceException("拉取公司信息失败，未设置有效的总部公司，请先设置~");
        }
        else {
            return list.get(0);// 认为只有1个有效的总部公司
        }
    }

    @Override
    public StaffOfficeDomain defaultOrgDept() {
        AuthorizationVO vo = SessionUserUtils.getSessionAttributeForUserDtl();
        // 关联的人员ID
        String staffId = vo.getHrStaffId();
        // 未关联人员
        if (StringUtils.isBlank(staffId)) {
            return null;
        }
        else {
            List<StaffOfficeDomain> list = staffOfficeService.selectStaffValidOrgDept(staffId);
            if (list == null || list.isEmpty()) {
                return null;
            }
            else {
                return list.get(0);// 取第一个作为默认
            }
        }
    }

    @Override
    public List<StaffOfficeDomain> myAllOrgDept() {
        AuthorizationVO vo = SessionUserUtils.getSessionAttributeForUserDtl();
        // 关联的人员ID
        String staffId = vo.getHrStaffId();
        // 未关联人员
        if (StringUtils.isBlank(staffId)) {
            return null;
        }
        else {
            return staffOfficeService.selectStaffValidOrgDept(staffId);
        }
    }

    @Override
    public String myAllVisibleOrg() {
        AuthorizationVO vo = SessionUserUtils.getSessionAttributeForUserDtl();
        // 关联的人员ID
        String staffId = vo.getHrStaffId();
        // 未关联人员
        if (StringUtils.isBlank(staffId)) {
            return null;
        }
        else {
            Set<OrgInfo> orgInfoSets = Sets.newHashSet();
            Set<String> orgIdSets = Sets.newHashSet();
            // 查询绑定有效期内的公司-部门信息
            List<StaffOfficeDomain> list = staffOfficeService.selectStaffValidOrgDept(staffId);
            for (StaffOfficeDomain var : list) {
                orgIdSets.add(var.getOrgId());
            }
            for (String orgId : orgIdSets) {
                // 添加到  当前公司与其子孙公司
                orgInfoSets.addAll(orgInfoService.selectVisibleOrgOfSelf(orgId));
            }
            // id集合 去重 
            Set<String> ids = Sets.newHashSet();
            for (OrgInfo var : orgInfoSets) {
                ids.add(var.getId());
            }
            return Joiner.on(",").join(ids);
        }
    }

    @Override
    public String myAllVisibleProCodes() {
        AuthorizationVO vo = SessionUserUtils.getSessionAttributeForUserDtl();
        // 关联的人员ID
        String staffId = vo.getHrStaffId();
        // 未关联人员
        if (StringUtils.isBlank(staffId)) {
            return null;
        }
        else {
            Set<OrgInfo> orgInfoSets = Sets.newHashSet();
            Set<String> orgIdSets = Sets.newHashSet();
            // 查询绑定有效期内的公司-部门信息
            List<StaffOfficeDomain> list = staffOfficeService.selectStaffValidOrgDept(staffId);
            for (StaffOfficeDomain var : list) {
                orgIdSets.add(var.getOrgId());
            }
            for (String orgId : orgIdSets) {
                // 添加到  当前公司与其子孙公司
                orgInfoSets.addAll(orgInfoService.selectVisibleOrgOfSelf(orgId));
            }
            // 项目编号集合，去重
            Set<String> proCodes = Sets.newHashSet();
            proCodes.add("\'placeholder\'"); // 占位
            for (OrgInfo var : orgInfoSets) {
                if (StringUtils.isNotBlank(var.getProjectCode())) {
                    proCodes.add("'" + var.getProjectCode() + "'");// 加单引号
                }
            }
            return Joiner.on(",").join(proCodes);
        }
    }

    @Override
    public void setDefaultOrgDept() {
        StaffOfficeDomain dom = defaultOrgDept();
        if (null != dom) {
            // session已经存在 则不覆盖
            if (null == SessionUserUtils.getSessionAttribute("bindOrgId")) {
                SessionUserUtils.setSessionAttribute("bindOrgId", dom.getOrgId());
            }
            if (null == SessionUserUtils.getSessionAttribute("bindOrgName")) {
                SessionUserUtils.setSessionAttribute("bindOrgName", dom.getCompName());
            }
            if (null == SessionUserUtils.getSessionAttribute("bindDeptId")) {
                SessionUserUtils.setSessionAttribute("bindDeptId", dom.getDeptId());
            }
            if (null == SessionUserUtils.getSessionAttribute("bindDeptName")) {
                SessionUserUtils.setSessionAttribute("bindDeptName", dom.getDeptName());
            }
        }
    }
}
